package com.gzh.system.service.impl;

import com.gzh.core.util.StringUtils;
import com.gzh.core.util.constant.ErrorCode;
import com.gzh.core.util.exception.BusinessException;
import com.gzh.system.service.SmsService;
import com.gzh.system.service.dto.SendSmsIn;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class SmsServiceImpl implements SmsService {

  @Value("${config.cos.secretId}")
  private String secretId;
  @Value("${config.cos.secretKey}")
  private String secretKey;
  @Value("${config.cos.region}")
  private String region;
  @Value("${config.sms.appid}")
  private String appid;
  @Autowired
  private RedisTemplate redisTemplate;

  @Override
  public boolean sendSms(SendSmsIn in) {
    Credential cred = new Credential(secretId, secretKey);
    // 实例化一个http选项，可选，没有特殊需求可以跳过
    HttpProfile httpProfile = new HttpProfile();
    httpProfile.setReqMethod("POST");
    httpProfile.setConnTimeout(60);
    //实例化一个客户端配置对象，可以指定超时时间等配置
    ClientProfile clientProfile = new ClientProfile();
    clientProfile.setSignMethod("HmacSHA256");
    clientProfile.setHttpProfile(httpProfile);
    SmsClient client = new SmsClient(cred,"ap-guangzhou",clientProfile);
    SendSmsRequest req = new SendSmsRequest();
    /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId，示例如1400006666 */
    req.setSmsSdkAppId(appid);
    /* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，签名信息可登录 [短信控制台] 查看 */
    String signName = "管哈哈个人网";
    req.setSignName(signName);
    /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息，server 会原样返回 */
//    String sessionContext = "xxx";
//    req.setSessionContext(sessionContext);
    /* 短信号码扩展号: 默认未开通，如需开通请联系 [sms helper] */
//    String extendCode = "";
//    req.setExtendCode(extendCode);

    /* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */
    String templateId = "1250461";
    req.setTemplateId(templateId);

    //验证码
    String verificationCode = StringUtils.getVerificationNumberCode();
    /* 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号]
     * 示例如：+8613711112222， 其中前面有一个+号 ，86为国家码，13711112222为手机号，最多不要超过200个手机号 */
    String[] phoneNumberSet = in.getTelList().split(",");
    for (int i = 0;i < phoneNumberSet.length;i++){
      redisTemplate.opsForValue().set(phoneNumberSet[i], verificationCode, Duration.ofMinutes(60));
      phoneNumberSet[i] = "+86" + phoneNumberSet[i];
    }
    req.setPhoneNumberSet(phoneNumberSet);

    /* 模板参数: 若无模板参数，则设置为空 */
    String[] templateParamSet = {verificationCode};
    req.setTemplateParamSet(templateParamSet);

    /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
     * 返回的 res 是一个 SendSmsResponse 类的实例，与请求对象对应 */
    SendSmsResponse res = null;
    try {
      res = client.SendSms(req);
    } catch (TencentCloudSDKException e) {
      e.printStackTrace();
      throw new BusinessException(ErrorCode.SMS_001);
    }

    // 输出json格式的字符串回包
    System.out.println(SendSmsResponse.toJsonString(res));

    // 也可以取出单个值，你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义
    System.out.println(res.getRequestId());
    return true;
  }
}
